#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QMessageBox>
#include <QFileDialog>
#include <QRandomGenerator>
#include "sendfile.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("文件发送端");
    ui->ip->setText("127.0.0.1");
    qDebug()<<"当前主线程的Id:" <<QThread::currentThreadId();
    m_server = new MyTcpSever(this);
    ui->port->setText("8989");
    connect(m_server,&MyTcpSever::newClient,this,[=](qintptr socket) //子线程worker对象使用
            {
                //在ui中显示已连接
                ui->connet->setText("已连接");

                //处理子线程闲逛的动作
                QThread* subThread = new QThread;
                //添加工作的类，使其工作移动到子线程中去工作
                //将socket文件内容传递进去
                sendfile* worker = new sendfile(socket); //不能指定this父对象，work要移动到子线程中，若添加this则不可指定
                worker->moveToThread(subThread);
                connect(this,&MainWindow::start,worker,&sendfile::working); //主线程调用start信号，子线程就可以调用working工作

                //当子线程working工作完成之后发出一个信号，主线程得到信号之后就可以销毁这些资源
                connect(worker,&sendfile::done,this,[=]()
                        {
                            //销毁了子线程，不能继续发送文件啦
                            //            qDebug()<<"销毁子线程和任务对象资源....";
                            //            subThread->quit(); //有些任务还没有完成
                            //            subThread->wait(); //等待完成
                            //            subThread->deleteLater(); //销毁子线程
                            //            worker->deleteLater();  //也销毁worker进程
                            //            ui->status->setText("未连接");
                        });
                connect(ui->pushButton_close,&QPushButton::clicked,this,[=]()
                        {
                            //销毁了子线程，不能继续发送文件啦
                            qDebug()<<"销毁子线程和任务对象资源....";
                            subThread->quit(); //有些任务还没有完成
                            subThread->wait(); //等待完成
                            subThread->deleteLater(); //销毁子线程
                            worker->deleteLater();  //也销毁worker进程
                            ui->connet->setText("未连接");
                            ui->pushButton_start->setEnabled(true);
                        });

                connect(worker,&sendfile::text,this,[=](QByteArray msg)
                        {
                            //修改每次发送的不同颜色
                            QVector<QColor> colors =
                                {
                                    Qt::red,Qt::green,Qt::black,Qt::blue,Qt::darkRed,Qt::cyan,Qt::magenta
                                };
                            int index = QRandomGenerator::global()->bounded(colors.size()); //获取colors里面的随机数
                            //取出某一种颜色
                            ui->textBrowser->setTextColor(colors.at(index)); //设置一种随机颜色

                            ui->textBrowser->append(msg);

                        });

                //同步文件发送的总长度
                connect(worker,&sendfile::tot_size_signal,this,[=](qint64 size)
                        {
                            //qDebug()<<"发送文件的总大小为"<<size;
                            ui->progressBar->setMinimum(0);
                            ui->progressBar->setMaximum(static_cast<int>(size));
                            ui->progressBar->setValue(0); //设置当前值
                        });
                //同步文件发送的目前长度
                connect(worker,&sendfile::now_size_signal,this,[=](qint64 size)
                        {
                            //qDebug()<<"发送当前文件大小"<<size;
                            ui->progressBar->setValue(static_cast<int>(size)); //设置当前值
                        });

                subThread->start(); //启动子线程 ，启动之后，woker不能工作，需要主线程给子线程发送信号，让其子线程工作
            });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_close_clicked()
{

}


void MainWindow::on_pushButton_start_clicked()
{
    //绑定端口
    unsigned short port = ui->port->text().toUShort();
    m_server->listen(QHostAddress(ui->ip->text()),port);
    //通信的套接字对象不可以跨线程访问
    ui->connet->setText("已连接");
    ui->pushButton_start->setEnabled(false);
}


void MainWindow::on_pushButton_selectfile_clicked()
{
    QString path = QFileDialog::getOpenFileName(this);//获取文件
    if(!path.isEmpty())
    {
        //将得到路径设置到
        ui->filePath->setText(path);
        return;
    }
    qDebug()<<"用户选中的内容为空";
}


void MainWindow::on_pushButton_sendMsg_clicked()
{
    //得到文件路径
    if(ui->filePath->text().isEmpty())
    {
        QMessageBox::information(this,"提示","要发送的文件不能为空");
        return;
    }
    if(!(ui->connet->text() == "已连接"))
    {
        QMessageBox::information(this,"提示","还未连接终端或服务器");
        return;
    }

    emit start(ui->filePath->text());
}

